Перейти к основному содержимому

5.07. Важные классы, интерфейсы

Разработчику Архитектору

Важные классы, интерфейсы

SPL (Standard PHP Library):

  • Iterator — интерфейс для итерации.
  • ArrayAccess — позволяет обращаться к объекту как к массиву.
  • Countable — реализует метод count().

DateTime:

$date = new DateTime();
echo $date->format('Y-m-d H:i:s');

Exceptions:

try {
throw new Exception("Ошибка!");
} catch (Exception $e) {
echo $e->getMessage();
}

Reflection – для анализа классов, методов и свойств во время выполнения:

$reflector = new ReflectionClass('User');
echo $reflector->getName();

SPL предоставляет готовые интерфейсы и классы для решения распространённых задач. Примеры:

  • SplStack, SplQueue
  • DirectoryIterator, RecursiveDirectoryIterator
  • SplObserver, SplSubject (паттерн Наблюдатель).

Возможности PHP

ФункцияОписание
print_r()Вывод информации о переменной (удобно для отладки)
var_dump()Подробный вывод с типами и размерами
array_map(), array_filter()Функциональные методы работы с массивами
json_encode(), json_decode()Работа с JSON
file_get_contents(), file_put_contents()Чтение/запись файлов
htmlspecialchars()Экранирование HTML-символов (безопасность)

Для валидации данных PHP предоставляет встроенный инструмент filter_var.

Пример:

$email = "test@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Email корректен";
}

Валидация URL:

$url = "https://example.com ";
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL валиден";
}

Санитизация:

$input = "<script>alert(1)</script>";
$safe = filter_var($input, FILTER_SANITIZE_STRING);
echo $safe; // alert(1)

Работа с базой данных осуществляется через PDO (PHP Data Objects):

$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$pass = '';

try {
$pdo = new PDO($dsn, $user, $pass);
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
} catch (PDOException $e) {
echo "Ошибка подключения: " . $e->getMessage();
}

Пример подготовленного запроса в БД:

$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute([$name, $email]);

Аутентификация, к примеру, простая проверка логина/пароля:

session_start();

if ($_POST['login'] === 'admin' && $_POST['password'] === '123') {
$_SESSION['logged_in'] = true;
header("Location: dashboard.php");
exit;
} else {
echo "Неверный логин или пароль";
}

PHP синхронный язык, но есть способы запускать фоновые задачи. К примеру, через exec():

exec("php background-task.php > /dev/null 2>&1 &");

…а также с использованием брокеров сообщений, таких как RabbitMQ.

Composer – менеджер зависимостей для PHP, позволяющий устанавливать пакеты и автоматически подключать классы.

require 'vendor/autoload.php';

use App\Services\Logger;

$logger = new Logger();
$logger->log('Новое событие');

Namespace (пространство имён) позволяет организовать код и избежать конфликтов имён классов:

// src/Database/Connection.php
namespace App\Database;

class Connection {
public function connect() {
return "Подключение установлено";
}
}

Использование:

use App\Database\Connection;

$conn = new Connection();
echo $conn->connect();

Traits – механизм повторного использования кода в нескольких классах без множественного наследования. Пример:

trait Loggable {
public function log($message) {
echo "[LOG] $message\n";
}
}

class UserService {
use Loggable;
}

$userService = new UserService();
$userService->log("Пользователь вошёл");

Генераторы (yield) позволяют создавать итерируемые объекты без хранения всего набора данных в памяти:

function numbers() {
for ($i = 1; $i <= 3; $i++) {
yield $i;
}
}

foreach (numbers() as $num) {
echo "$num\n";
}

Отложенные вызовы позволяют гарантировать выполнение определённого кода даже при закрытии скрипта.

finally:

try {
throw new Exception("Ошибка!");
} catch (Exception $e) {
echo "Перехвачено\n";
} finally {
echo "Это выполнится всегда\n";
}


exit() / die():

if (!file_exists('data.txt')) {
exit("Файл не найден.");
}


register_shutdown_function():

function shutdown() {
echo "Завершение работы скрипта.\n";
}

register_shutdown_function('shutdown');

exit("Выход...\n"); // shutdown всё равно вызовется

Магические методы позволяют добавлять динамическое поведение классам. __get и __set:

class User {
private $data = [];

public function __set($name, $value) {
$this->data[$name] = $value;
}

public function __get($name) {
return $this->data[$name] ?? null;
}
}

$user = new User();
$user->name = "Алексей";
echo $user->name; // Алексей


__call:

class Math {
public function __call($method, $args) {
if (str_starts_with($method, 'calc')) {
return array_sum($args);
}
throw new \Exception("Метод $method не найден");
}
}

$math = new Math();
echo $math->calcTotal(2, 3, 5); // 10